import { asyncRoutes, constantRoutes } from '@/router'

/**
 * Use meta.role to determine if the current user has permission
 * @param roles
 * @param route
 */
// hasPermission(['editor],{path,component,meta:{roles:['editor']}}):boolean
// hasPermission(['editor],{path,component,meta:{roles:['baoan']}}):boolean
// hasPermission(['editor],{path,component,meta:{roles:['baoan','editor']}}):boolean
// hasPermission(['editor],{path,component,meta:{}}):boolean
// 判断当前用户能不能访问当前路由规则，返回布尔值
function hasPermission(roles, route) {
  // route.meta 规则中又meta  并且  meta中又roles选项
  if (route.meta && route.meta.roles) {
    // 看一下，['editor]有没有在meta:{roles:['editor']}中
    // 如果在返回true，如果不在就返回false
    return roles.some(role => route.meta.roles.includes(role))
  } else {
    // 如果meta中没有roles，返回true，说明当前用户是有权限访问此规则
    return true
  }
}

/**
 * Filter asynchronous routing tables by recursion
 * @param routes asyncRoutes
 * @param roles
 */
// routes是所有的动态路由规则
// roles是当前角色
export function filterAsyncRoutes(routes, roles) {
  // res中保存了当前用户可以访问的路由规则
  const res = []

  // 遍历所有的动态路由规则
  routes.forEach(route => {   //route是每一个规则
    // 把每一个规则，使用临时变量存储
    const tmp = { ...route }
    // roles是角色["editor"]  tmp是每一个规则
    // hasPermission(['editor],{path,component,meta:{roles:['editor']}}):boolean
    if (hasPermission(roles, tmp)) {
      // 如果规则中有children 递归计算当前用户是否有权限
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles)
      }
      res.push(tmp)
    }
  })
  // 最终返回res
  return res
}

const state = {
  routes: [], // 静态路由规则 + 当前用户可访问的动态路由规则
  addRoutes: [] // 只是当前用户可访问的动态路由规则
}

const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
  }
}

// const actions = {
//   // generateRoutes 计算生成需要权限访问的动态路由规则
//   generateRoutes({ commit }, roles) {
//     return new Promise(resolve => {
//       let accessedRoutes  // accessedRoutes 计算出来需要权限访问的动态路由规则
//       // 如果roles中包含了admin，把所有的动态路由，赋值给accessedRoutes
//       if (roles.includes('admin')) {
//         // 也就是说，如果是admin用户，它可以访问所有的动态路由
//         // admin用户，不需要去计算可访问的动态路由
//         accessedRoutes = asyncRoutes || []
//       } else {
//         // 用户不是admin，filterAsyncRoutes就是去计算出当前用户可以访问那些动态路由
//         // asyncRoutes是所有的路由  roles当前角色 editor
//         // filterAsyncRoutes  就会计算出来可访问的路由
//         accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
//       }
//       commit('SET_ROUTES', accessedRoutes)
//       resolve(accessedRoutes)
//     })
//   }
// }

const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      let accessedRoutes  
      // if (roles.includes('admin')) {
      //   accessedRoutes = asyncRoutes || []
      // } else {
      //   accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      // }

      // 这样写，表示不管你是不是admin用户，都要参与权限设计
      accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
